package com.zty.user.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @Author ZTY
 * @Description 自定义线程池
 * @Date 12:44 2024-01-11
 **/

@Configuration
public class ThreadPoolConfig {

    /**
     * 20：表示线程池中的核心线程数，也就是最小的线程数。当有任务需要执行时，线程池会创建这些核心线程来执行任务。
     *
     * 50：表示线程池中的最大线程数，也就是最多可以创建的线程数。
     * 当任务的数量超过了核心线程数，并且任务队列已经满了，线程池会创建新的线程来执行任务，直到线程数达到最大线程数。
     *
     * 5：表示线程池中的线程空闲时间。当一个线程空闲时间超过了这个值，线程池会将其销毁，以节省系统资源。
     *
     * TimeUnit.SECONDS：表示线程空闲时间的单位，这里设置为秒。
     *
     * new LinkedBlockingDeque<>(50)：表示线程池中的任务队列，这里使用了一个容量为50的阻塞队列。
     * 当任务的数量超过了核心线程数时，任务会被放入这个任务队列中等待执行。
     *
     * new ThreadPoolExecutor.DiscardPolicy()：表示线程池中的任务拒绝策略，当任务队列已满，并且线程数已经达到最大线程数时，
     * 线程池会拒绝新的任务。这里使用了一个丢弃策略，表示当任务队列已满时，线程池会直接丢弃新的任务。
     *
     * @return
     */
    @Bean(name = "mailThreadPool")
    public ThreadPoolExecutor getMailThreadPool() {

        //  声明自己的线程工厂
        CustomNameThreadFactory mail = new CustomNameThreadFactory("mail");

        return new ThreadPoolExecutor(20, 50, 5, TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(50),
                mail,
                new ThreadPoolExecutor.DiscardPolicy());
    }
}
